# coding=utf-8
"""
Author: Mr.夏末
@Function: 函数的参数列表
"""


def func1(a, b, c, *args):
    """
    按照传递顺序，一一对应
    注意：必填位置型参数 必须写在通用位置参数的前面
    :param a,b,c: 必填位置型参数
    :param args: 通用位置型参数（可以接收0~∞个参数，接收为元组）
    """
    print(a, b, c)
    print(args)


func1(1, 2, 3, 4, 5, 6, 7)


def func2(x: int = 1, y=2, **kwargs):
    """
    键值对参数:按照键值对应接收，与顺序无关
    :param x,y: 带默认值的参数,也可以按照位置传(不推荐)
    :kwargs: 未定义的键值对参数，都接收为一个字典
    :return:
    """
    print(x, y)
    print(kwargs)


# 不传就使用默认值
func2()
# 带默认值参数可以按照位置传
func2(5, 4)
# 未定义的键值对参数，接收为一个字典
func2(x=9, z='roy', y=8, m=7, n=6)


# 混合参数：键值对参数一定要写在位置型参数的后面
def func3(a, *args, b=1, **kwargs):
    print(a, b)
    print(args, kwargs)


func3(12, 34, 56, b=78, c=90, d=100)

print("------------------------------------------")
# 线性的数据结构，可以通过*p的形式迭代传入参数列表
p = [6, 8, 10, 12, 14, 16]
func1(6, 8, 10, 12, 14, 16)
func1(*p)

print("------------------------------------------")
# 键值对数据结构可以通过**p的形式迭代传入参数列表
p = {'x':11,'y':22,'z':98,'m':"roy"}
func2(m='roy',z=98,x=11,y=22)
func2(**p)

# 通用传参方式
def func4(*args,**kwargs):
    print(args,kwargs)

func4(1,2,3,4,5,a=1,b=2,c=3,d=4)